1 //look for FIXME_VAR_TYPE
2 // Converted from UnityScript to C# at http://www.M2H.nl/files/js_to_c.php - by Mike Hergaarden
3 // Do test the code! You usually need to change a few small bits.
4
5 using UnityEngine;
6 using System.Collections;
7 using System.Collections.Generic;
8
9 [RequireComponent(typeof(AudioSource))]
10 public class GameControllerScript : MonoBehaviour {
11
12 public Transform block;
13 public Transform connector;
14 public Transform[,,] blocks = new Transform[3,3,3];
15 private Transform[,,,] connectors = new Transform[3,3,3,3];
16 private int cubeRotationX; //how much the original cube has been rotated around X axis
17 private int cubeRotationY; //how much the original cube has been rotated around Y axis
18 private int cubeRotationZ; //how much the original cube has been rotated around Z axis
19 private float moveStartTime = -1F;
20 public float scale = 3F;
21 public bool moving = false;
22 public bool rotating = false;
23 public float moveDuration = 0.10F;
24 public float yOffset;
25 private int score;
26 public GUISkin currentGUISkin;
27 public static bool performRestart = false;
28 private bool initialized = false;
29 public string gameView = "menu";
30 public Camera mainCamera;
31 private Vector2 scrollPosition;
32 public Light gameLight;
33
34 //sounds and audio source setup
35 public AudioClip swipeSoundX;
36 public AudioClip swipeSoundY;
37 public AudioClip swipeSoundZ;
38 public AudioClip collideSound;
39 private AudioSource swipeAudioSource;
40 private AudioSource collideAudioSource;
41
42 //default light intensity
43 public float lightIntensity = 0.4f;
44
45 private OptionsScript options;
46 private TimerScript timer;
47
48 void Start (){
49
50 int x;
51 int y;
52 int z;
53 int axis;
54 yOffset = 1F;
55 Transform blockInstance;
56 BlockScript blockScript;
57 ConnectorScript connectorScript;
58 Transform connectorInstance;
59 TextMesh textMesh;
60
61 this.gameView = "menu";
62 this.options = this.gameObject.GetComponent ("OptionsScript") as OptionsScript;
63 this.timer = this.gameObject.GetComponent ("TimerScript") as TimerScript;
64 this.sizeGUI();
65
66 this.options.InitOptions();
67
68 //setup audio sources
69
70 AudioSource[] audioSources = GetComponents<AudioSource>();
71 this.swipeAudioSource = audioSources[0];
72 this.collideAudioSource = audioSources[1];
73 this.collideAudioSource.clip = this.collideSound;
74
75 //instantiate the blocks and connectors and position them
76 for (x = 0; x <= 2; x++) {
77 for (y = 0; y <= 2; y++) {
78 for (z = 0; z <= 2; z++) {
79 //instantiate the block
80 blockInstance = Instantiate (block, new Vector3(x * this.scale, y * this.scale + this.yOffset, z * this.scale), Quaternion.identity) as Transform;
81 this.blocks[x,y,z] = blockInstance;
82 blockScript = blockInstance.gameObject.GetComponent("BlockScript") as BlockScript;
83 blockScript.Initialize(x,y,z,this);
84 }
85 }
86 }
87
88 // instantiate the connectors
89 for (x = 0; x <= 2; x++) {
90 for (y = 0; y <= 2; y++) {
91 for (z = 0; z <= 2; z++) {
92 //instantiate the x connector
93 connectorInstance = Instantiate (connector) as Transform;
94 connectorScript = connectorInstance.gameObject.GetComponent("ConnectorScript") as ConnectorScript;
95 connectorScript.Initialize(x,y,z,"x", this);
96 this.connectors[x,y,z,0] = connectorInstance;
97
98 //instantiate the y connector
99 connectorInstance = Instantiate (connector) as Transform;
100 connectorScript = connectorInstance.gameObject.GetComponent("ConnectorScript") as ConnectorScript;
101 connectorScript.Initialize(x,y,z,"y", this);
102 this.connectors[x,y,z,1] = connectorInstance;
103
104 //instantiate the z connector
105 connectorInstance = Instantiate (connector) as Transform;
106 connectorScript = connectorInstance.gameObject.GetComponent("ConnectorScript") as ConnectorScript;
107 connectorScript.Initialize(x,y,z,"z", this);
108 this.connectors[x,y,z,2] = connectorInstance;
109 }
110 }
111 }
112
113 //instantiate the move blocks
114 if (PlayerPrefs.HasKey ("game_status")) {
115 this.loadSavedGame();
116 }
117 else {
118 this.restart ();
119 }
120 }
121
122 void setBlockNumber ( Transform blockInstance , int blockNumber ){
123 BlockScript blockScript;
124 blockScript = blockInstance.gameObject.GetComponent("BlockScript") as BlockScript;
125 blockScript.setBlockNumber(blockNumber);
126 }
127
128 public int getBlockNumber ( Transform blockInstance ){
129 BlockScript blockScript;
130 blockScript = blockInstance.gameObject.GetComponent("BlockScript") as BlockScript;
131 return blockScript.blockNumber;
132 }
133
134 public int getBlockNumber(int x, int y, int z) {
135 return this.getBlockNumber (this.blocks [x, y, z]);
136 }
137
138 private int getInitialBlockNumber(int x, int y, int z) {
139
140 if(this.options.board_type == "Solid Cube") {
141 return -1;
142 }
143
144 if(this.options.board_type == "Hollow Cube") { //hollow cube
145 if(x == 1 && y == 1 && z == 1) {
146 return -2;
147 }
148 else {
149 return -1;
150 }
151 }
152
153 if(this.options.board_type == "Box Outline") { //box outline
154 if(x == 1 && y == 1) {
155 return -2;
156 }
157 if(x == 1 && z == 1) {
158 return -2;
159 }
160 if(y ==1 && z == 1) {
161 return -2;
162 }
163 else {
164 return -1;
165 }
166 }
167
168 if(this.options.board_type == "Four Walls") {
169 if(x == 1 && z == 1) {
170 return -2;
171 }
172 else {
173 return -1;
174 }
175 }
176
177 //default is no corners
178 if(this.options.board_type == "No Corners/Center") {
179 if(x==1 && y==1 && z==1) {
180 return -2;
181 }
182 else if(x == 1 || y == 1 || z == 1) {
183 return -1;
184 }
185 else {
186 return -2;
187 }
188 }
189
190 //default is no corners
191 //if(this.options.board_type == "No Corners") {
192 if(x == 1 || y == 1 || z == 1) {
193 return -1;
194 }
195 else {
196 return -2;
197 }
198 //}
199
200
201
202 }
203
204 private List<Transform> getEmptyBlocks (){
205 int x;
206 int y;
207 int z;
208 int count = 0;
209 List<Transform> emptyBlocks = new List<Transform>();
210 for (x = 0; x <= 2; x++) {
211 for (y = 0; y <= 2; y++) {
212 for (z = 0; z <= 2; z++) {
213 if (this.getBlockNumber(this.blocks[x,y,z]) == -1) {
214 emptyBlocks.Add(this.blocks[x,y,z]);
215 count = count + 1;
216 }
217 }
218 }
219 }
220 return emptyBlocks;
221 }
222
223 private bool fillRandomBlock (ref int x, ref int y, ref int z, ref int newNumber) {
224 List<Transform> emptyBlocks = this.getEmptyBlocks();
225 int emptyIndex;
226 BlockScript blockScript;
227
228 if (emptyBlocks.Count > 0) {
229 emptyIndex = Random.Range(0, emptyBlocks.Count);
230 if(this.options.use_0) {
231 newNumber = Random.Range(0,3) * 2;
232 }
233 else {
234 newNumber = Random.Range(1,3) * 2;
235 }
236 this.setBlockNumber(emptyBlocks[emptyIndex], newNumber);
237 blockScript = emptyBlocks[emptyIndex].GetComponent("BlockScript") as BlockScript;
238 x = blockScript.x;
239 y = blockScript.y;
240 z = blockScript.z;
241 return true;
242 }
243
244 //no empty blocks to return
245 return false;
246 }
247
248 private void adjustConnectors() {
249 int j, k, axis;
250 ConnectorScript connectorScript;
251 bool show;
252 // for (j = 0; j <= 2; j++) {
253 // for (k = 0; k <= 2; k++) {
254 // for (axis = 0; axis <= 2; axis++) {
255 // connectorScript = this.connectors[j,k,axis].gameObject.GetComponent("ConnectorScript") as ConnectorScript;
256 // connectorScript.show = true;
257 //
258 // if (this.options.board_type == "Hollow Cube") {
259 // if(j == 1 & k == 1) {
260 // connectorScript.show = false;
261 // }
262 // }
263 //
264 // if (this.options.board_type == "Box Outline") { //Box Outline
265 // if(j == 1 || k == 1) {
266 // connectorScript.show = false;
267 // }
268 // }
269 //
270 // if (this.options.board_type == "Four Walls") {
271 // //remove center connector on the x axis
272 // if(axis == 0 && j == 1 & k == 1) {
273 // connectorScript.show = false;
274 // }
275 // //remove 3 center connectors on the y axis
276 // if(axis == 1 && j == 1) {
277 // connectorScript.show = false;
278 // }
279 // //remove 3 center connectors on the z axis
280 // if(axis == 2 && k == 1) {
281 // connectorScript.show = false;
282 // }
283 // }
284 //
285 //
286 // if (this.options.board_type == "No Corners") {
287 // if(j != 1 && k != 1) {
288 // connectorScript.show = false;
289 // }
290 // }
291 // }}}
292 }
293
294 public bool doMove (string axis, int direction) {
295 int loop1, loop2; //looping variables
296 int x, y, z; //block location variables
297 int numMoves = 0; //number of moves to make
298 int scoreChange = 0;
299 bool blockCollision = false;
300 bool blockCollisionSound = false;
301 Transform blockA, blockB, blockC; //variables for holding the three blocks in a row
302 IDictionary<string, int> newNumbers = new Dictionary<string, int>(); //new numbers for blocks a,b & c to have
303 IDictionary<string, int> shiftBy = new Dictionary<string, int>(); //distance for blocks a,b & c to shift
304 int[,,] numbersAfterMove = new int[3,3,3];
305 ;
306 if (PlayerPrefs.GetString ("game_status") != "playing") return false;
307 if (this.gameView != "game") return false;
308
309 //loop through each of the 9 rows to be calculated
310 for(loop1 = 0; loop1 <=2; loop1++) {
311 for(loop2 = 0; loop2 <=2; loop2++) {
312 if (axis == "x") {
313 y = loop1;
314 z = loop2;
315 if (direction == 1) {
316 blockA= this.blocks[0,y,z];
317 blockB= this.blocks[1,y,z];
318 blockC= this.blocks[2,y,z];
319 }
320 else {
321 blockA= this.blocks[2,y,z];
322 blockB= this.blocks[1,y,z];
323 blockC= this.blocks[0,y,z];
324 }
325 }
326 else if (axis == "y") {
327 x = loop1;
328 z = loop2;
329 if (direction == 1) {
330 blockA= this.blocks[x,0,z];
331 blockB= this.blocks[x,1,z];
332 blockC= this.blocks[x,2,z];
333 }
334 else {
335 blockA= this.blocks[x,2,z];
336 blockB= this.blocks[x,1,z];
337 blockC= this.blocks[x,0,z];
338 }
339 }
340 else {
341 x = loop1;
342 y = loop2;
343 if (direction == 1) {
344 blockA= this.blocks[x,y,0];
345 blockB= this.blocks[x,y,1];
346 blockC= this.blocks[x,y,2];
347 }
348 else {
349 blockA= this.blocks[x,y,2];
350 blockB= this.blocks[x,y,1];
351 blockC= this.blocks[x,y,0];
352 }
353 }
354 calculateRowChanges(this.getBlockNumber(blockA), this.getBlockNumber(blockB), this.getBlockNumber(blockC), ref scoreChange, ref newNumbers, ref shiftBy, ref blockCollision);
355
356 blockA.GetComponent<BlockScript>().move (axis, shiftBy["a"] * direction, this.scale, newNumbers["a"]);
357 blockB.GetComponent<BlockScript>().move (axis, shiftBy["b"] * direction, this.scale, newNumbers["b"]);
358 blockC.GetComponent<BlockScript>().move (axis, shiftBy["c"] * direction, this.scale, newNumbers["c"]);
359
360 numMoves = numMoves + shiftBy["a"] + shiftBy["b"] + shiftBy["c"];
361 if (blockCollision) blockCollisionSound = true;
362
363 int newHighestBlock = 0;
364 if(newNumbers["a"] > PlayerPrefs.GetInt ("game_highest_block")) newHighestBlock = newNumbers["a"];
365 if(newNumbers["b"] > PlayerPrefs.GetInt ("game_highest_block")) newHighestBlock = newNumbers["b"];
366 if(newNumbers["c"] > PlayerPrefs.GetInt ("game_highest_block")) newHighestBlock = newNumbers["c"];
367
368 if (newHighestBlock > 0) {
369 PlayerPrefs.SetInt ("game_highest_block", newHighestBlock);
370 if (newHighestBlock == 2048) PlayerPrefs.SetString("game_status","game_won");
371 PlayerPrefs.Save ();
372 this.timer.SetNextBlockTarget(newHighestBlock);
373 if (newHighestBlock > this.getHighestBlock()) this.SetHighestBlock(newHighestBlock);
374 }
375
376
377
378
379 PlayerPrefs.Save ();
380
381 //save the numbers after the move for redo
382 numbersAfterMove[blockA.GetComponent<BlockScript>().x,
383 blockA.GetComponent<BlockScript>().y,
384 blockA.GetComponent<BlockScript>().z] = newNumbers["a"];
385
386 numbersAfterMove[blockB.GetComponent<BlockScript>().x,
387 blockB.GetComponent<BlockScript>().y,
388 blockB.GetComponent<BlockScript>().z] = newNumbers["b"];
389
390 numbersAfterMove[blockC.GetComponent<BlockScript>().x,
391 blockC.GetComponent<BlockScript>().y,
392 blockC.GetComponent<BlockScript>().z] = newNumbers["c"];
393 }
394 }
395
396 if(blockCollisionSound && this.options.play_sounds) {
397 this.collideAudioSource.PlayDelayed(this.moveDuration);
398 }
399
400 if (numMoves > 0) {
401 this.moveStartTime = Time.time;
402 this.setScore (this.score + scoreChange);
403 if(this.options.play_sounds) {
404 if (axis == "x") this.swipeAudioSource.PlayOneShot(swipeSoundX);
405 if (axis == "y") this.swipeAudioSource.PlayOneShot(swipeSoundY);
406 if (axis == "z") this.swipeAudioSource.PlayOneShot(swipeSoundZ);
407 }
408 return true;
409 }
410 else {
411 return false;
412 }
413 }
414
415 //Determine the possible successful combines between 3 blockNumbers (a,b,c) being pushed toward c
416 void calculateRowChanges (int a, int b, int c, ref int scoreChange, ref IDictionary<string, int> newNumbers, ref IDictionary<string, int> shiftBy, ref bool blockCollision ) {
417 blockCollision = false;
418
419 //first check if we have any -2 values which signify that blocks cant merge along this connector
420 if(a == -2 || b == -2 || c == -2) {
421 newNumbers["a"] = a;
422 newNumbers["b"] = b;
423 newNumbers["c"] = c;
424 shiftBy["a"] = 0;
425 shiftBy["b"] = 0;
426 shiftBy["c"] = 0;
427 }
428 else {
429 //figure out if any of the three merges occurred
430 shiftBy ["c"] = 0;
431 if (c > -1 && c == b) { //b and c merged
432 scoreChange = scoreChange + c*2;
433 blockCollision = true;
434 newNumbers["c"] = c*2;
435 newNumbers["b"] = a;
436 newNumbers["a"] = -1;
437 shiftBy["b"] = 1;
438 if(a > -1) {
439 shiftBy["a"] = 1;
440 }
441 else if (a == -1) {
442 shiftBy["a"] = 0;
443 }
444 }
445 else if (b > -1 && a == b) { //a and b merged
446 scoreChange = scoreChange + a*2;
447 blockCollision = true;
448 if(c == -1) {
449 newNumbers["c"] = b*2;
450 newNumbers["b"] = -1;
451 newNumbers["a"] = -1;
452 shiftBy["b"] = 1;
453 shiftBy["a"] = 2;
454 }
455 else {
456 newNumbers["c"] = c;
457 newNumbers["b"] = b*2;
458 newNumbers["a"] = -1;
459 shiftBy["b"] = 0;
460 shiftBy["a"] = 1;
461 }
462 }
463 else if (c > -1 && a == c && b == -1) { //a and c merged
464 scoreChange = scoreChange + c*2;
465 blockCollision = true;
466 newNumbers["c"] = c*2;
467 newNumbers["b"] = -1;
468 newNumbers["a"] = -1;
469 shiftBy["b"] = 0;
470 shiftBy["a"] = 2;
471 } //end of merges block
472 else { //no merges occurred
473 if(c > -1) { //last column has number
474 newNumbers["c"] = c;
475 if(b > -1) { //second column has number
476 newNumbers["b"] = b;
477 newNumbers["a"] = a;
478 shiftBy["b"] = 0;
479 shiftBy["a"] = 0;
480 }
481 else if(b == -1) {//second column empty
482 newNumbers["b"] = a;
483 newNumbers["a"] = -1;
484 shiftBy["b"] = 0;
485 if (a == -1) {
486 shiftBy["a"] = 0;
487 }
488 else {
489 shiftBy["a"] = 1;
490 }
491 }
492
493 } //end of block for value in c column
494 else if (c == -1) { //first column empty
495 if(b > -1) { //second column has number
496 newNumbers["c"] = b;
497 newNumbers["b"] = a;
498 newNumbers["a"] = -1;
499 shiftBy["b"] = 1;
500 if(a > -1) {
501 shiftBy["a"] = 1;
502 }
503 else {
504 shiftBy["a"] = 0;
505 }
506
507 }
508 else if(b == -1) { //second column empty and first column empty
509 newNumbers["c"] = a;
510 newNumbers["b"] = -1;
511 newNumbers["a"] = -1;
512 shiftBy["b"] = 0;
513 if (a == -1) {
514 shiftBy["a"] = 0;
515 }
516 else {
517 shiftBy["a"] = 2;
518 }
519 }
520 }
521 } //end of no merges block
522 } //end of check for -2;
523 }
524
525
526 void Update (){
527 int x =0, y=0, z=0, newNumber=0;
528 if(GameControllerScript.performRestart) {
529 this.restart ();
530 GameControllerScript.performRestart = false;
531 }
532 if(moveStartTime >= 0) {
533 if(Time.time - this.moveStartTime > this.moveDuration + 0.05F) {
534 this.fillRandomBlock(ref x, ref y, ref z, ref newNumber);
535 this.saveHistory ();
536 this.moveStartTime = -1F;
537 if(this.getEmptyBlocks().Count == 0) {
538 if(this.CheckGameOver()) {
539 PlayerPrefs.SetString ("game_status", "game_over");
540 PlayerPrefs.Save();
541 }
542 }
543 }
544 }
545 else {
546 bool moved;
547 if (Input.GetKeyUp("right")) moved = this.doMove ("x", 1);
548 if (Input.GetKeyUp("left")) moved = this.doMove ("x", -1);
549 if (Input.GetKeyUp("up")) moved = this.doMove ("y", 1);
550 if (Input.GetKeyUp("down")) moved = this.doMove ("y", -1);
551 if (Input.GetKeyUp("a")) moved = this.doMove ("z", 1);
552 if (Input.GetKeyUp("z")) moved = this.doMove ("z", -1);
553 }
554 this.adjustConnectors();
555 if (Input.GetKey(KeyCode.Escape))
556 {
557 Application.Quit();
558 }
559 }
560
561 void FixedUpdate () {
562 }
563
564 void setScore(int score) {
565 this.score = score;
566 PlayerPrefs.SetInt ("score", score);
567
568 //handle setting high score
569 if(this.score > this.GetHighScore()) {
570 this.SetHighScore(this.score);
571 }
572 }
573
574 public void restart() {
575 int[,,] positions = new int[3, 3, 3];
576 int x=0, y=0, z=0, newNumber=0;
577 this.gameLight.intensity = this.lightIntensity;
578
579 for (x = 0; x <= 2; x++) {
580 for (y = 0; y <= 2; y++) {
581 for (z = 0; z <= 2; z++) {
582 this.setBlockNumber(this.blocks[x,y,z], this.getInitialBlockNumber(x,y,z));
583 positions[x,y,z] = -1;
584 }
585 }
586 }
587
588 this.adjustConnectors ();
589
590 PlayerPrefs.SetString ("redo_moves2","");
591 PlayerPrefs.SetString ("redo_moves1","");
592 PlayerPrefs.SetString ("redo_moves0","");
593 PlayerPrefs.SetInt ("redos", 2);
594 PlayerPrefs.SetString ("game_status", "playing");
595 PlayerPrefs.SetInt ("game_highest_block", 0);
596 PlayerPrefs.SetInt ("cube_rotation_x", 0);
597 PlayerPrefs.SetInt ("cube_rotation_y", 0);
598 PlayerPrefs.SetInt ("cube_rotation_z", 0);
599 PlayerPrefs.Save ();
600
601 this.fillRandomBlock(ref x, ref y, ref z, ref newNumber);
602 positions [x, y, z] = newNumber;
603 this.fillRandomBlock(ref x, ref y, ref z, ref newNumber);
604 positions [x, y, z] = newNumber;
605 this.saveHistory();
606
607 this.setScore (0);
608
609 TimerScript timerScript = this.gameObject.GetComponent ("TimerScript") as TimerScript;
610 timerScript.ResetTimer();
611 }
612
613 public int GetHighScore()
614 {
615 string key = "highscore-" + options.GetOptionsKey();
616 if (PlayerPrefs.HasKey (key)) {
617 return PlayerPrefs.GetInt (key);
618 }
619 else {
620 this.SetHighScore(0);
621 return 0;
622 }
623 }
624
625 void SetHighScore(int myHighScore)
626 {
627 string key = "highscore-" + options.GetOptionsKey();
628 PlayerPrefs.SetInt( key, myHighScore );
629 PlayerPrefs.Save();
630 }
631
632 public int getHighestBlock()
633 {
634 string key = "highestblock-" + options.GetOptionsKey();
635 if (PlayerPrefs.HasKey (key)) {
636 return PlayerPrefs.GetInt (key);
637 }
638 else {
639 this.SetHighestBlock(0);
640 return 0;
641 }
642 }
643
644 void SetHighestBlock(int highestBlock)
645 {
646 string key = "highestblock-" + options.GetOptionsKey();
647 PlayerPrefs.SetInt( key, highestBlock );
648 PlayerPrefs.Save();
649 }
650
651 private bool CheckGameOver() {
652
653 string[] axisList = new string[3] {"x", "y", "z"};
654 int direction = 1;
655 string axis = "x";
656 int loop1, loop2, loopAxis; //looping variables
657 int x, y, z; //block location variables
658 int numMoves = 0; //number of moves to make
659 int scoreChange = 0;
660 bool blockCollision = false;
661 Transform blockA, blockB, blockC; //variables for holding the three blocks in a row
662 IDictionary<string, int> newNumbers = new Dictionary<string, int>(); //new numbers for blocks a,b & c to have
663 IDictionary<string, int> shiftBy = new Dictionary<string, int>(); //distance for blocks a,b & c to shift
664
665 //loop through each of the 9 rows to be calculated
666 for(loopAxis = 0; loopAxis < 3; loopAxis ++) {
667 axis = axisList[loopAxis];
668 for(direction = -1; direction < 2; direction += 2) {
669 for(loop1 = 0; loop1 <=2; loop1++) {
670 for(loop2 = 0; loop2 <=2; loop2++) {
671 if (axis == "x") {
672 y = loop1;
673 z = loop2;
674 if (direction == 1) {
675 blockA= this.blocks[0,y,z];
676 blockB= this.blocks[1,y,z];
677 blockC= this.blocks[2,y,z];
678 }
679 else {
680 blockA= this.blocks[2,y,z];
681 blockB= this.blocks[1,y,z];
682 blockC= this.blocks[0,y,z];
683 }
684 }
685 else if (axis == "y") {
686 x = loop1;
687 z = loop2;
688 if (direction == 1) {
689 blockA= this.blocks[x,0,z];
690 blockB= this.blocks[x,1,z];
691 blockC= this.blocks[x,2,z];
692 }
693 else {
694 blockA= this.blocks[x,2,z];
695 blockB= this.blocks[x,1,z];
696 blockC= this.blocks[x,0,z];
697 }
698 }
699 else {
700 x = loop1;
701 y = loop2;
702 if (direction == 1) {
703 blockA= this.blocks[x,y,0];
704 blockB= this.blocks[x,y,1];
705 blockC= this.blocks[x,y,2];
706 }
707 else {
708 blockA= this.blocks[x,y,2];
709 blockB= this.blocks[x,y,1];
710 blockC= this.blocks[x,y,0];
711 }
712 }
713 calculateRowChanges(this.getBlockNumber(blockA), this.getBlockNumber(blockB), this.getBlockNumber(blockC), ref scoreChange, ref newNumbers, ref shiftBy, ref blockCollision);
714
715 numMoves = numMoves + shiftBy["a"] + shiftBy["b"] + shiftBy["c"];
716 }
717 }
718 }
719 }
720 if (numMoves > 0) {
721 return false;
722 }
723 else {
724 return true;
725 }
726 }
727
728 void OnGUI() {
729 //GAME GUI
730 if (this.gameView == "game") {
731 GUI.skin = currentGUISkin;
732 this.gameLight.intensity = this.lightIntensity;
733 this.mainCamera.transform.eulerAngles = new Vector3 (16F, 29.5F, 0);
734
735 //create rotating buttons
736
737
738
739 if (PlayerPrefs.GetString ("game_status") == "game_over") {
740 GUI.Label (new Rect (0, Screen.height * 0.3f , Screen.width, Screen.height * 0.10F), "Game Over", "BigLabel");
741 this.gameLight.intensity = 0;
742 }
743 if (PlayerPrefs.GetString ("game_status") == "game_won") {
744 GUI.Label (new Rect (0, Screen.height * 0.3f , Screen.width, Screen.height * 0.10F), "You Won!", "BigLabel");
745 if (GUI.Button(new Rect(Screen.width * .33f, Screen.height * 0.4F, Screen.width * 0.30F, Screen.height * 0.06F),"Continue")) {
746 PlayerPrefs.SetString ("game_status", "playing");
747 PlayerPrefs.Save ();
748 }
749 this.gameLight.intensity = 0;
750 }
751
752 GUI.Label (new Rect (0, 0, Screen.width, Screen.height * 0.06F), "Score: " + this.score.ToString (), "BigLabel");
753 string highScoreText = "High Score/Block: " + this.GetHighScore ().ToString () + " / " + this.getHighestBlock ().ToString ();
754 GUI.Label (new Rect (0, Screen.height * 0.06F, Screen.width, Screen.height / 10), highScoreText, "SmallLabel");
755
756
757 GUIStyle style = currentGUISkin.GetStyle ("button");
758 //style.fontSize = 14;
759
760 if (GUI.Button(new Rect(1, Screen.height * 0.12F, Screen.width * 0.30F, Screen.height * 0.06F),"Menu")) {
761 this.gameView = "menu";
762 }
763 if (GUI.Button(new Rect(Screen.width * .33f, Screen.height * 0.12F, Screen.width * 0.33F, Screen.height * 0.06F),"Restart")) {
764 this.restart();
765 }
766 if (GUI.Button(new Rect(Screen.width * .7f, Screen.height * 0.12F, Screen.width * .3f, Screen.height * 0.06F), "Undo (" + PlayerPrefs.GetInt ("redos").ToString () + ")")) {
767 this.undo();
768 }
769
770
771 //Roation buttons
772
773
774 //GUI.Label(new Rect(Screen.width * .8f, Screen.height * 0.72F, Screen.width * .1f, Screen.height * 0.06F), "", "RotateButton");
775
776 //left button
777 if (GUI.Button(new Rect(Screen.width * .73f, Screen.height * 0.72F, Screen.width * .1f, Screen.height * 0.06F), "\t", "RotateButtonLeft")) {
778 this.rotateBlocks(Vector3.up);
779 }
780 //right button
781 if (GUI.Button(new Rect(Screen.width * .87f, Screen.height * 0.72F, Screen.width * .1f, Screen.height * 0.06F), "", "RotateButtonRight")) {
782 this.rotateBlocks(Vector3.down);
783 }
784 //up button
785 if (GUI.Button(new Rect(Screen.width * .8f, Screen.height * 0.675F, Screen.width * .1f, Screen.height * 0.06F), "", "RotateButtonUp")) {
786 this.rotateBlocks(Vector3.right);
787 }
788 //down button
789 if (GUI.Button(new Rect(Screen.width * .8f, Screen.height * 0.765F, Screen.width * .1f, Screen.height * 0.06F), "", "RotateButtonDown")) {
790 this.rotateBlocks(Vector3.left);
791 }
792 }
793 }
794
795 private void sizeGUI() {
796 this.currentGUISkin.GetStyle ("Label").fontSize = Mathf.CeilToInt(Screen.height * 0.04F);
797 this.currentGUISkin.GetStyle ("Button").fontSize = Mathf.CeilToInt(Screen.height * 0.04F);
798 this.currentGUISkin.GetStyle ("Subheader").fontSize = Mathf.CeilToInt(Screen.height * 0.05F);
799 this.currentGUISkin.GetStyle ("Toggle").fontSize = Mathf.CeilToInt(Screen.height * 0.04F);
800 this.currentGUISkin.GetStyle ("ToggleLabel").fontSize = Mathf.CeilToInt(Screen.height * 0.04F);
801 this.currentGUISkin.GetStyle ("ToggleLabelWarning").fontSize = Mathf.CeilToInt(Screen.height * 0.04F);
802
803 this.currentGUISkin.GetStyle ("SmallLabel").fontSize = Mathf.CeilToInt(Screen.height * 0.03F);
804
805 this.currentGUISkin.GetStyle ("BigLabel").fontSize = Mathf.CeilToInt(Screen.height * 0.06F);
806
807 this.currentGUISkin.GetStyle ("Toggle").padding.top = Mathf.CeilToInt(Screen.height * 0.04F);
808 this.currentGUISkin.GetStyle ("Toggle").padding.left = Mathf.CeilToInt(Screen.height * 0.04F);
809 }
810
811 private void saveHistory() {
812 int x,y,z;
813 string stringVal = "";
814
815 //create comma separated list of values
816 for (x = 0; x <= 2; x++) {
817 for (y = 0; y <= 2; y++) {
818 for (z = 0; z <= 2; z++) {
819 stringVal = stringVal + getBlockNumber(this.blocks[x,y,z]).ToString() + ",";
820 }
821 }
822 }
823 //add score and highest block to end of array
824 stringVal = stringVal + this.score.ToString() + "," + PlayerPrefs.GetInt ("game_highest_block").ToString();
825
826 PlayerPrefs.SetString ("redo_moves2",PlayerPrefs.GetString ("redo_moves1"));
827 PlayerPrefs.SetString ("redo_moves1",PlayerPrefs.GetString ("redo_moves0"));
828 PlayerPrefs.SetString ("redo_moves0",stringVal);
829
830 PlayerPrefs.Save();
831 }
832
833 private void undo() {
834 string[] positions = new string[27];
835 int myNum = 0;
836 char[] separator = {','};
837
838 if( PlayerPrefs.GetString ("game_status") != "game_over"
839 && PlayerPrefs.GetString ("redo_moves1") != ""
840 && PlayerPrefs.GetInt ("redos") > 0
841 ) {
842 positions = PlayerPrefs.GetString ("redo_moves1").Split (separator);
843 //loop through and set the block numbers for each block
844 for (int x = 0; x <= 2; x++) {
845 for (int y = 0; y <= 2; y++) {
846 for (int z = 0; z <= 2; z++) {
847 int.TryParse(positions[9*x+3*y+z], out myNum);
848 this.setBlockNumber(this.blocks[x,y,z],myNum);
849 }
850 }
851 }
852
853 //roll back the score
854 int.TryParse (positions[27], out myNum);
855 this.setScore (myNum);
856
857 //roll back the game_highest_block
858 int.TryParse (positions[28], out myNum);
859 PlayerPrefs.SetInt ("game_highest_block", myNum);
860
861 //move all the redo moves back
862 PlayerPrefs.SetString ("redo_moves0",PlayerPrefs.GetString ("redo_moves1"));
863 PlayerPrefs.SetString ("redo_moves1",PlayerPrefs.GetString ("redo_moves2"));
864 PlayerPrefs.SetString ("redo_moves2","");
865 PlayerPrefs.SetInt ("redos", PlayerPrefs.GetInt ("redos") - 1);
866 }
867 }
868
869 private void rotateBlocks(Vector3 direction) {
870 Transform block;
871 BlockScript blockScript;
872 Transform connector;
873 ConnectorScript connectorScript;
874 this.rotating = true;
875 for (int x = 0; x <= 2; x++) {
876 for (int y = 0; y <= 2; y++) {
877 for (int z = 0; z <= 2; z++) {
878 block = this.blocks[x,y,z];
879 block.GetComponent<BlockScript>().rotateBlock(direction);
880
881 for(int axis = 0; axis <=2; axis++) {
882 connector = this.connectors[x,y,z,axis];
883 connector.GetComponent<ConnectorScript>().rotateConnector (direction);
884 }
885 }
886 }
887 }
888 }
889
890 private void loadSavedGame() {
891 string[] positions = new string[27];
892 int positionNum = 0;
893 char[] separator = {','};
894 positions = PlayerPrefs.GetString ("redo_moves0").Split (separator);
895
896 for (int x = 0; x <= 2; x++) {
897 for (int y = 0; y <= 2; y++) {
898 for (int z = 0; z <= 2; z++) {
899 int.TryParse(positions[9*x+3*y+z], out positionNum);
900 this.setBlockNumber(this.blocks[x,y,z],positionNum);
901 }
902 }
903 }
904
905
906 this.adjustConnectors ();
907 this.setScore (PlayerPrefs.GetInt ("score"));
908
909 }
910 }
look for FIXME_VAR_TYPE
Converted from UnityScript to C# at http:www.M2H.nlfilesjs_to_c.php - by Mike Hergaarden
Do test the code! You usually need to change a few small bits.
private int cubeRotationX; how much the original cube has been rotated around X axis
private int cubeRotationY; how much the original cube has been rotated around Y axis
private int cubeRotationZ; how much the original cube has been rotated around Z axis
sounds and audio source setup
default light intensity
setup audio sources
instantiate the blocks and connectors and position them
instantiate the block
instantiate the connectors
instantiate the x connector
instantiate the y connector
instantiate the z connector
instantiate the move blocks
if(this.options.board_type == "Hollow Cube") { hollow cube
if(this.options.board_type == "Box Outline") { box outline
default is no corners
default is no corners
if(this.options.board_type == "No Corners") {
}
no empty blocks to return
for (j = 0; j <= 2; j++) {
for (k = 0; k <= 2; k++) {
for (axis = 0; axis <= 2; axis++) {
connectorScript = this.connectors[j,k,axis].gameObject.GetComponent("ConnectorScript") as ConnectorScript;
connectorScript.show = true;
if (this.options.board_type == "Hollow Cube") {
if(j == 1 & k == 1) {
connectorScript.show = false;
}
}
if (this.options.board_type == "Box Outline") { Box Outline
if(j == 1 || k == 1) {
connectorScript.show = false;
}
}
if (this.options.board_type == "Four Walls") {
remove center connector on the x axis
if(axis == 0 && j == 1 & k == 1) {
connectorScript.show = false;
}
remove 3 center connectors on the y axis
if(axis == 1 && j == 1) {
connectorScript.show = false;
}
remove 3 center connectors on the z axis
if(axis == 2 && k == 1) {
connectorScript.show = false;
}
}
if (this.options.board_type == "No Corners") {
if(j != 1 && k != 1) {
connectorScript.show = false;
}
}
}}}
int loop1, loop2; looping variables
int x, y, z; block location variables
int numMoves = 0; number of moves to make
Transform blockA, blockB, blockC; variables for holding the three blocks in a row
IDictionary newNumbers = new Dictionary(); new numbers for blocks a,b & c to have
IDictionary shiftBy = new Dictionary(); distance for blocks a,b & c to shift
loop through each of the 9 rows to be calculated
save the numbers after the move for redo
Determine the possible successful combines between 3 blockNumbers (a,b,c) being pushed toward c
first check if we have any -2 values which signify that blocks cant merge along this connector
figure out if any of the three merges occurred
if (c > -1 && c == b) { b and c merged
else if (b > -1 && a == b) { a and b merged
else if (c > -1 && a == c && b == -1) { a and c merged
} end of merges block
else { no merges occurred
if(c > -1) { last column has number
if(b > -1) { second column has number
else if(b == -1) {second column empty
} end of block for value in c column
else if (c == -1) { first column empty
if(b > -1) { second column has number
else if(b == -1) { second column empty and first column empty
} end of no merges block
} end of check for -2;
handle setting high score
int loop1, loop2, loopAxis; looping variables
int x, y, z; block location variables
int numMoves = 0; number of moves to make
Transform blockA, blockB, blockC; variables for holding the three blocks in a row
IDictionary newNumbers = new Dictionary(); new numbers for blocks a,b & c to have
IDictionary shiftBy = new Dictionary(); distance for blocks a,b & c to shift
loop through each of the 9 rows to be calculated
GAME GUI
create rotating buttons
style.fontSize = 14;
Roation buttons
GUI.Label(new Rect(Screen.width * .8f, Screen.height * 0.72F, Screen.width * .1f, Screen.height * 0.06F), "", "RotateButton");
left button
right button
up button
down button
create comma separated list of values
add score and highest block to end of array
loop through and set the block numbers for each block
roll back the score
roll back the game_highest_block
move all the redo moves back